<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script lang="javascript">
    let obj1 = {
        a: 1,
        b: { f: { g: 1 } },
        c: [1, 2, 3],
        d:'',
        e:Date.now(),
        f:new RegExp('\\w+'),
        getData: function() {
          console.log('我就是JSON')
        },
    };


    // 深拷贝开辟一个新的栈，两个对象属完成相同，但是对应两个不同的地址，修改一个对象的属性，不会改变另一个对象的属性
    // 深拷贝的方式
    // 1.  _.cloneDeep() lodash插件
    // const _ = require('lodash')
    // import _ from 'lodash'
    // const obj2 = _.cloneDeep(obj1);
    // console.log(obj1.b.f === obj2.b.f)

    // 2.jQuery.extend()
    // const $ = require('jquery');
    // const obj2 = $.extend(true, {}, obj1);
    // console.log(obj1.b.f === obj2.b.f); // false

    // 3.JSON.stringfy() JSON.parse联合使用  【常用】
    // // 坑在后续说明
    // const obj2 = JSON.parse(JSON.stringify(obj1))
    // console.log(obj1.b.f===obj2.b.f);
    

    // 4.循环递归 手动实现 【常用】
    // 主要就是数组 对象 普通值 null的递归
    function deepClone(obj){
        if (obj===null) return obj;
        if (obj instanceof Date) return new Date(obj);
        if (obj instanceof RegExp) return new RegExp(obj);
        if (typeof obj !== "object") return obj;
        //  Array.isArray(obj) 用于确定是否是一个array
        let newObj = Array.isArray(obj) ? [] :{};
        for (let i in obj){
          newObj[i] =typeof obj[i] === "object" ? deepClone(obj[i]) :obj[i]
        }
        return newObj;
    }
    // let obj2 = deepClone(obj1)
    // console.log(obj1,obj2);
    // console.log(obj1.b.f===obj2.b.f);

    // function deepClone(obj,hash=new WeakMap()){
    //   if(obj===null) return obj;
    //   if(obj instanceof Date) return new Date(obj);
    //   if(obj instanceof RegExp) return new RegExp(obj);
    //   if(typeof obj !== 'object') return obj;
    //   if(hash.get(obj)) return hash.get(obj);
    //   let cloneObj = new obj.constructor();
    //   hash.set(obj,cloneObj);
    //   for(let key in obj){
    //     if(obj.hasOwnProperty(key)){
    //       cloneObj[key] = deepClone(obj[key],hash);
    //     }
    //   }
    //   return newObj;
    // }

  </script>
</body>
</html>